package JDBC;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/8/24 12:44
 * JDBC：一组API，包含一些类和方法，通过这些类和方法实现数据库的基本操作，
 *      再由数据库厂商，提供各自的数据库驱动包，和JDBC的API对接；
 *      实现跨平台 通用性
 * 使用：1.创建项目
 *      2.引入依赖-JDBC编程中要用到mysql的驱动包（驱动包就是把mysql自身的API给转换成JDBC风格的）
 *              驱动包是mysql官方提供的
 *           1)下载驱动包
 *              （mysql官网）/(maven中央仓库)--->maven ：java中的构建工具
 *                                                     中央仓库：每次下载一个软件都要官网，
 *                                                              为了方便，把这些第三方库放在一个仓管
 *                                                              （相当于应用商店）
 *           2)导入项目中
 *              a>创建一个目录，随便起个名字，例如lib
 *              b>把刚下载的jar文件拷贝到刚才的目录中
 *              c>右击刚才的目录，有一个选项，叫做 add as library
 *       3.编写代码：
 *          编写流程：1)创建DataSource/MysqlDataSource对象，用来描述数据源（地址、端口、数据库名、用户名、密码）
 *                              这个对象描述数据库服务器在哪   【java.sql  jdbc提供的类和方法在这个包里】
 *                              getConnection方法
 *                   2)创建连接 Connection，表示数据连接。
 *                              prepareStatement方法
 *                   3)构造sql语句，创建PrepareStatement对象，描述要执行的sql
 *                                  executeUpdate方法，executeQuery方法1
 *                   4)执行sql
 *                   5)释放资源
 *
 *      使用DataSource获取连接，应用一个连接池，更高效
 */
public class Demo1 {
    public static void main(String[] args) throws SQLException {
        /*法一：代码中持有的是DataSource类型，后面一些其他代码如果要用到DataSource，相关数据类型 也是DataSource，
              未来数据库要进行切换时，代码几乎不需要改动
               低耦合*/
//1.建DataSource对象
        // DataSource是一个接口，MysqlDataSource()是jar包实现的类。向上转型（父类的引用指向子类的实例）
        DataSource dataSource = new MysqlDataSource();
        //描述数据库服务器在哪
        //设置数据库所在的地址
        //(MysqlDataSource)dataSource ,向下转型（父类的引用转回子类的实例）
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jdbc?characterEncoding=utf8&useSSL=false");
        //设置登录数据库的用户名
        ((MysqlDataSource)dataSource).setUser("root");
        //设置登录数据库的密码
        ((MysqlDataSource)dataSource).setPassword("1234");

       /* 法二：这种方法同理，但是未来数据库要进行切换时，代码改动很大
                高耦合*/
//        MysqlDataSource mysqlDataSource = new MysqlDataSource();
//        mysqlDataSource.setURL();
//        mysqlDataSource.setUser();
//        mysqlDataSource.setPassword();
//2.让代码和数据库建立连接:使用java.sql中的Connection  到站
        Connection connection = dataSource.getConnection();

//3.操作数据库，以插入数据为例
        //关键就是构造一个sql语句
        //在jdbc中的sql，不必带上；
        //;只是在命令行中用于区分不同的语句，这里是在代码中操作
        String sql = "insert into student values(1,'张某')";
        //此处光是一个String类型的sql还不够，需要把 这个 String包装成 “语句对象”
        PreparedStatement statement = connection.prepareStatement(sql);

//4.执行sql   取件
        //sql 是 insert、update、delete，都使用executeUpdate（）；
        //sql 是 select 使用executeQuery（）；
        //返回值为影响了几行
        int ret = statement.executeUpdate();
        System.out.println(ret);

//5.此时sql执行完毕，然后需要释放资源
        statement.close();
        connection.close();
    }
}
